package entities

import (
	"github.com/asaskevich/govalidator"
	"github.com/pkg/errors"
	"slices"
)

type MenuPageListReq struct {
	PageListReq
	MenuName string `json:"menuName" form:"menuName"`
}

type MenuRouterItem struct {
	AlwaysShow bool              `json:"alwaysShow,omitempty"`
	Children   []*MenuRouterItem `json:"children,omitempty"`
	Component  string            `json:"component"`
	Hidden     bool              `json:"hidden"`
	Name       string            `json:"name"`
	Path       string            `json:"path"`
	Redirect   string            `json:"redirect,omitempty"`
	Meta       *MenuRouterMeta   `json:"meta"`
}
type MenuRouterMeta struct {
	Icon    string  `json:"icon"`
	Link    *string `json:"link"`
	Title   string  `json:"title"`
	NoCache bool    `json:"noCache"`
}

const (
	MenuTypeM = "M"
	MenuTypeC = "C"
	MenuTypeF = "F"
)

type MenuSaveReq struct {
	MenuID    int64  `json:"menuId" form:"menuId"`       // 菜单ID
	MenuName  string `json:"menuName" form:"menuName"`   // 菜单名称
	ParentID  int64  `json:"parentId" form:"parentId"`   // 父菜单ID
	OrderNum  *int64 `json:"orderNum" form:"orderNum"`   // 显示顺序
	Path      string `json:"path" form:"path"`           // 路由地址
	Component string `json:"component" form:"component"` // 组件路径
	Query     string `json:"query" form:"query"`         // 路由参数
	IsFrame   string `json:"isFrame" form:"isFrame"`     // 是否为外链（0是 1否）
	IsCache   string `json:"isCache" form:"isCache"`     // 是否缓存（0缓存 1不缓存）
	MenuType  string `json:"menuType" form:"menuType"`   // 菜单类型（M目录 C菜单 F按钮）
	Visible   string `json:"visible" form:"visible"`     // 菜单状态（0显示 1隐藏）
	Status    string `json:"status" form:"status"`       // 菜单状态（0正常 1停用）
	Perms     string `json:"perms" form:"perms"`         // 权限标识
	Icon      string `json:"icon" form:"icon"`           // 菜单图标
	Remark    string `json:"remark" form:"remark"`       // 备注
}

func (e *MenuSaveReq) Check() error {
	if e.MenuName == "" {
		return errors.New("菜单名称不能为空")
	}
	if e.OrderNum == nil {
		return errors.New("显示排序不能为空")
	}

	if !slices.Contains([]string{MenuTypeM, MenuTypeF, MenuTypeC}, e.MenuType) {
		return errors.New("菜单类型错误")
	}
	if e.MenuType != MenuTypeF {
		if e.Path == "" {
			return errors.New("路由地址不能为空")
		}
		if e.IsFrame == "0" && !govalidator.IsURL(e.Path) {
			return errors.New("外部地址格式错误")
		}
	}

	return nil
}

type MenuTreeItem struct {
	Id       int64           `json:"id"`
	Label    string          `json:"label"`
	Children []*MenuTreeItem `json:"children,omitempty"`
}
